#============================================
#知识点
#1、什么是序列化
#序列化指的是把内存的数据类型转换成- 个特定 的格式的内容
#该格式的内容可用于存储或者传输给其他平台使用
#内存中的数据类型---->序列化---- >特定的格式(json格式或者pickle格式)
#内存中的数据类型<---反序列化<---- 特定的格式(json格式或者pickle格式) 
#土办法:
#{ 'aaa' :111}--->序列化str({'aaa' :111})----->"{'aaa' :111}"
#{'aaa' :111}<---反序列化eval("{ 'aaa':111}")<-----"{ 'aaa':111}"

#2为何要序烈化
#序列化得到结果=>特定的格式的内容有两种用途
#1、可用于存储=》用于存档
#2、传输给其他平台使用=》跨平台数据交互
#python     =====>      java 
# 列表    特定的格式      数组

#强调:
#针对用途1的特定一格式:是一种专用的格式只给python用。          pickle
#针对用途2的特定一格式:应该是一种通用，能够被所有语言识别的格式。  json
#============================================
# import json
# json_res = json.dumps([1,"qwq",True,False]) #将列表序列化转为json类型
# print(json_res)
# jie_res = json.loads(json_res)  #将json数据反序列为python数据
# print(jie_res)

# with open("地址","w") as f: 
#     json.dump("数据",f,ensure_ascii=False)  #ensure_ascii=False展示的时候可以是中文，就是好看 
                                             #把数据转换为json形式保存到文件中

# with open("地址","r") as f:
#     json.load(f)  #把json数据转换为python形式再从文件中读出来

# json验证: json格式兼容的是所有语言通用的数据类型，不能识别单语言的所有类型
# ison.dumps({1,2,3,4,5})
#============================================
#pickle模块
# import pickle
# res = pickle.dumps([1,2,3,4,"qwq"])
# print(res)
# jie_res = pickle.loads(res)
# print(jie_res)
# with open("地址","w") as f: 
#     pickle.dump("数据",f)  #把数据转换为pickle形式保存到文件中

# with open("地址","r") as f:
#     pickle.load(f)  #把pickle数据转换为python形式再从文件中读出来
# # 与json类型一致用法（针对python用）
#============================================
# 一.什么是猴子补丁?
#属性在运行时的动态替换，叫做猴子补丁（Monkey Patch）。
#猴子补丁的核心就是用自己的代码替换所用模块的源代码，详细地如下
#1，这个词原来为Guerrilla Patch，杂牌军、游击队，说明这部分不是原装的，在英文里guerilla发音和gorllia(猩猩)相似，再后来就写了monkey(猴子)。
#2，还有一种解释是说由于这种方式将原来的代码弄乱了(messing with it)，在英文里叫monkeying about(顽皮的)，所以叫做Monkey Patch。

# # 二. 猴子补丁的功能(一切皆对象)
# 1.拥有在模块运行时替换的功能, 例如: 一个函数对象赋值给另外一个函数对象(把函数原本的执行的功能给替换了)
# class Monkey:
#     def hello(self):
#         print('hello')

#     def world(self):
#         print('world')


# def other_func():
#     print("from other_func")
# monkey = Monkey()
# monkey.hello = monkey.world
# monkey.hello()
# monkey.world = other_func
# monkey.world()




# 三.monkey patch的应用场景
# 如果我们的程序中已经基于json模块编写了大量代码了，发现有一个模块ujson比它性能更高，
# 但用法一样，我们肯定不会想所有的代码都换成ujson.dumps或者ujson.loads,那我们可能
# 会想到这么做
# import ujson as json，但是这么做的需要每个文件都重新导入一下，维护成本依然很高
# 此时我们就可以用到猴子补丁了
# 只需要在入口处加上
# , 只需要在入口加上:

# import json
# import ujson

# def monkey_patch_json():
#     json.__name__ = 'ujson'
#     json.dumps = ujson.dumps
#     json.loads = ujson.loads

# monkey_patch_json() # 之所以在入口处加，是因为模块在导入一次后，后续的导入便直接引用第一次的成果

# #其实这种场景也比较多, 比如我们引用团队通用库里的一个模块, 又想丰富模块的功能, 除了继承之外也可以考虑用Monkey
# Patch.采用猴子补丁之后，如果发现ujson不符合预期，那也可以快速撤掉补丁。个人感觉Monkey
# Patch带了便利的同时也有搞乱源代码的风险!
#============================================
import json

with open("地址","w") as f: 
    json.dump("数据",f,ensure_ascii=False) 